#include "SymboleValue.h"
#include <stdlib.h>


#include <iostream>
using namespace std;

#include "TableSymboles.h"
/*! \file symboleValue.cc
    \brief L'implementation des symboles valués
   
    Définit les méthodes et attributs associés à la classe symbole valués
    \author Jamet + Koelsch
    \date 19/12/2012
 */

////////////////////////////////////////////////////////////////////////////////

/*! \fn SymboleValue(Symbole s)
    \brief Constructeur de la classe SymboleValue
    \param s - le symbole existant
*/
SymboleValue::SymboleValue(Symbole s) :
	Symbole(s.getChaine()) {
	if (s == "<ENTIER>") {
		valeur = new ValeurEntiere(atoi(s.getChaine().c_str())); // c_str convertit une string en char*
		defini = true;
	} 
        else if (s == "<STRING>") {
                valeur = new ValeurChaine(s.getChaine());
                defini = true;
        }
        else if (s == "<REEL>") {
                valeur = new ValeurReelle((float)atof(s.getChaine().c_str()));
                defini = true;
        }
        else {
		valeur = NULL;
		defini = false;
	}
}

////////////////////////////////////////////////////////////////////////////////


/*! \fn void afficher()
    \brief Affiche le symbole en tant que noeud de l'arbre
    \param indentation - valeur de l'indentation du noeud
*/
void SymboleValue::afficher(unsigned short indentation) {
	Noeud::afficher(indentation);
	cout << "Feuille - Symbole value : " << this->getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
/*! \fn tradC()
    \brief Traduit les noeuds reçus en code Ada compilable
*/
void SymboleValue::tradC(fstream &fichier) {
    
     fichier<< this->getChaine()<<" ";
//    }
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue

/*! \fn friend ostream & operator  (ostream & cout, SymboleValue symb)
    \brief Affiche un symbole value sur cout
*/
ostream & operator <<(ostream & cout, SymboleValue symb) {
	cout << (Symbole) symb << "\t\t - Valeur=";
	if (symb.defini)
        {
            Valeur* v= symb.getValeur();

            if (typeid (*v)==typeid(ValeurEntiere))
            {
              cout << ((ValeurEntiere*)v)->getValeur() << endl;
            }
        
            else if (typeid(*v)==typeid(ValeurReelle))
            {
               cout << ((ValeurReelle*)v)->getValeur() << endl;
            }
            
            else if (typeid(*v)==typeid(ValeurChaine))
            {
                cout << ((ValeurChaine*)v)->getValeur() << endl;
            }
        }
        else 
	    cout << "indefinie ";
	return cout;
}
